﻿
CREATE PROCEDURE [dbo].[MngChangeGoods]
(--Замена кодов товаров
	@FromGoodsId int, --код товара, который, возможно, будет удалён из бд
	@ToGoodsId int		--код товара, который подставляется вместо @FromGoodsId
)
AS
DECLARE @ChangedTbl table(  --в эту таблицу записываются изменённые перекодировки
	[Id] [int] NOT NULL,
	[GoodsId] [int] NOT NULL,
	[ContragentId] [int] NOT NULL,
	[GoodsCode] [int] NOT NULL,
	[GoodsName] [varchar](150) COLLATE Cyrillic_General_CI_AS NOT NULL,
	[CountryName] [varchar](20) COLLATE Cyrillic_General_CI_AS NULL,
	[ManufacturerName] [varchar](70) COLLATE Cyrillic_General_CI_AS NULL,
	DuplId int NULL
);

SET NOCOUNT ON ;

--UPDATE PR.DefekturaGoods SET GoodsId = @ToGoodsId WHERE GoodsId = @FromGoodsId
DELETE FROM PR.DefekturaGoods WHERE GoodsId = @FromGoodsId --после замены кода товара нужно пересчитывать категории товаров для дефектуры

UPDATE CD.InputLines SET GoodsId = @ToGoodsId, MW = 'Смена товара', MD = getdate() WHERE GoodsId = @FromGoodsId

UPDATE CD.Parties SET GoodsId = @ToGoodsId, MW = 'Смена товара', MD = getdate() WHERE GoodsId = @FromGoodsId

UPDATE CD.ManageDocLines SET GoodsId = @ToGoodsId, MW = 'Смена товара', MD = getdate() WHERE GoodsId = @FromGoodsId

DELETE FROM PR.PriceLinesParsed WHERE GoodsId = @FromGoodsId

UPDATE CA.GoodsVsContragents SET GoodsId = @ToGoodsId, MW = 'Смена товара', MD = getdate() 
OUTPUT INSERTED.Id, INSERTED.GoodsId, INSERTED.ContragentId, INSERTED.GoodsCode, 
INSERTED.GoodsName, INSERTED.CountryName, INSERTED.ManufacturerName
INTO @ChangedTbl (Id, GoodsId, ContragentId, GoodsCode, --сохраняем изменённые перекодировки
GoodsName, CountryName, ManufacturerName)
WHERE GoodsId = @FromGoodsId AND ToDelete = 0;

--ищем дублирующиеся перекодировки, которые возникли в результате смены товара
UPDATE D SET D.DuplId = S.Id
FROM @ChangedTbl D INNER JOIN CA.GoodsVsContragents S
ON D.GoodsId = S.GoodsId
AND D.ContragentId = S.ContragentId 
AND D.GoodsCode = S.GoodsCode
AND D.GoodsName = S.GoodsName
AND IsNull(D.CountryName, 'AAAAA') = IsNull(S.CountryName, 'AAAAA')
AND IsNull(D.ManufacturerName, 'AAAAA') = IsNull(S.ManufacturerName, 'AAAAA') 
AND D.Id <> S.Id

--удаляем новые перекодировки, которые не задублировались
DELETE FROM @ChangedTbl WHERE DuplId Is Null

--Меняем коды перекодировок
UPDATE D SET D.SupplierGoodsId = S.DuplId, MW = 'Смена товара', MD = getdate()
FROM CD.InputLines D INNER JOIN @ChangedTbl S ON D.SupplierGoodsId = S.Id

UPDATE D SET D.GoodsVsContragentsId = S.DuplId
FROM PR.PriceLinesParsed D INNER JOIN @ChangedTbl S ON D.GoodsVsContragentsId = S.Id

UPDATE D SET D.GoodsVsContragentsId = S.DuplId, MW = 'Смена товара', MD = getdate()
FROM CD.ManageDocLines D INNER JOIN @ChangedTbl S ON D.GoodsVsContragentsId = S.Id

--Удаляем лишние (задублированные) перекодировки, которые возникли в результате смены товара
IF EXISTS (SELECT Id FROM CO.Departments WHERE Id > 1)
BEGIN  --есть офис и аптеки
	IF  EXISTS (SELECT * FROM PR.DepartmentOptions WHERE DepartmentId = 0)  --скрипт запущен в офисе
		UPDATE D SET ToDelete = 1, MW = 'Смена товара', MD = getdate()
		FROM CA.GoodsVsContragents D INNER JOIN @ChangedTbl S ON D.Id = S.Id
	ELSE --скрипт запущен в аптеке
		DELETE D FROM CA.GoodsVsContragents D INNER JOIN @ChangedTbl S ON D.Id = S.Id

END ELSE BEGIN --только одна аптека
	DELETE D FROM CA.GoodsVsContragents D INNER JOIN @ChangedTbl S ON D.Id = S.Id
END
--меняем наследника на нового
	UPDATE CA.Goods SET ChildId = @ToGoodsId WHERE ChildId = @FromGoodsId

RETURN 0
